Einheit 6 — Die Prüfkette: check, compile, graph
Was du nach dieser Einheit weißt: Du weißt, warum
valid: truekeine Aussage über die Funktionsfähigkeit eines Workflows ist, und kennst die dreistufige Prüfung, die jeden Fehler abfängt, den die Werkzeuge überhaupt abfangen können.
Drei Werkzeuge, drei Fragen
Alle drei arbeiten ausschließlich auf dem Text. Sie fassen deine Instanz nicht an, kosten nichts und dauern Millisekunden. Es gibt keinen Grund, eines davon zu überspringen.
| Werkzeug | Frage | Fängt |
|---|---|---|
towelscript_check | Ist die Syntax gültig? | Tippfehler, unbekannte Node-Typen, kaputte Klammern |
towelscript_compile | Was wird daraus konkret? | Falsch verschachtelte Optionen, verschluckte Werte, falscher Agent-Typ |
towelscript_graph | Wie ist es verbunden? | Fehlende, falsche oder verschluckte Verbindungen |
Stufe 1 — towelscript_check
{
"valid": true,
"errors": [],
"warnings": [],
"stats": { "lines": 37, "nodes": 3, "flows": 1, "modules": 1 }
}
Im Fehlerfall bekommst du Zeile, Spalte und einen Code:
{
"message": "unexpected token 'payload' in flow body",
"code": "E0201",
"line": 8,
"column": 5
}
Die stats sind mehr wert, als sie aussehen: Stimmt nodes mit der Zahl überein, die du geschrieben hast? Wenn du sieben Nodes geschrieben hast und hier steht 6, hast du ein Problem — noch bevor du irgendetwas deployst.
check nicht prüft- Optionsnamen.
post_urlsstattpost_urlist syntaktisch einwandfrei — und funktioniert nicht. - Optionswerte. Ein Liquid-Ausdruck, der ins Leere greift, ist ein gültiger String.
- Ob die Verbindungen überhaupt ausgewertet wurden. Genau hier liegt der teuerste Fehler.
Stufe 2 — towelscript_compile
compile zeigt dir den Workflow so, wie er in 42°flow ankommt: jeden Agent mit Typ, GUID und allen Optionen.
{
"type": "Agents::PostAgent",
"name": "anlegen",
"guid": "ad1b7feb8ddde31b920ff3810cc10f18",
"options": {
"content_type": "json",
"method": "post",
"no_merge": true,
"payload": {
"company": "{{ company }}",
"email": "{{ email }}",
"name": "{{ name }}"
},
"post_url": "https://…/contacts"
}
}
Worauf du hier schaust:
- Ist der Agent-Typ der erwartete?
httpohnepost_urlwird zuAgents::WebsiteAgentstattAgents::PostAgent. - Sind verschachtelte Optionen wirklich verschachtelt? Siehe unten.
- Ist jede Option da, die du geschrieben hast? Mit
=geschriebene Objekte verschwinden spurlos. - Ist
linksgefüllt?
Die drei Schreibweisen im Compile-Ergebnis
So sieht derselbe Post-Node in den drei Varianten aus Einheit 4 aus:
// payload: { … } ✅
"options": {
"post_url": "https://…",
"payload": { "name": "{{ name }}" }
},
"links": [ { "source": 0, "receiver": 1 }, { "source": 1, "receiver": 2 } ]
// payload { … } ❌ flach gezogen, links leer
"options": {
"post_url": "https://…",
"name": "{{ name }}"
},
"links": []
// payload = { … } ❌ Option komplett weg
"options": {
"post_url": "https://…"
},
"links": []
Stufe 3 — towelscript_graph
graph reduziert alles auf die Frage, die im Compile-Ergebnis leicht untergeht:
{
"flows": [
{
"name": "kontaktanfrage",
"nodes": [
{ "name": "eingang", "node_type": "form", "line": 4 },
{ "name": "extrahieren", "node_type": "ai", "line": 10 },
{ "name": "anlegen", "node_type": "http.post", "line": 17 }
],
"edges": [
{ "from": "eingang", "to": "extrahieren", "kind": "data" },
{ "from": "extrahieren", "to": "anlegen", "kind": "data" }
]
}
]
}
Die Regel ist einfach: bei n Nodes in einer Kette erwartest du n − 1 Kanten. Sind es weniger, stimmt etwas nicht. Ist edges leer, obwohl du eine Verbindungszeile geschrieben hast, hast du mit Sicherheit irgendwo einen { … }-Block ohne Doppelpunkt.
graph ist die schnellste Kontrolle von allen — eine Zeile Ausgabe, eine Zahl vergleichen.
Der Ablauf in der Praxis
TowelScript schreiben
│
├─ check → valid? stats.nodes plausibel?
│
├─ graph → edges = nodes − 1?
│
├─ compile → Agent-Typen richtig? payload verschachtelt?
│ jede Option vorhanden? links gefüllt?
│
└─ deploy
Formuliere das gegenüber Claude Code als feste Erwartung, dann musst du nicht jedes Mal einzeln danach fragen:
„Prüfe jede TowelScript-Änderung mit check, compile und graph, bevor du deployst. Zeig mir dabei immer die Anzahl der Kanten aus graph."
Schreib die Regel in eine CLAUDE.md in deinem Projektordner. Claude Code liest diese Datei bei jedem Start und hält sich daran, ohne dass du es wiederholen musst — dasselbe Prinzip wie eine Team-Konvention, nur für den Assistenten.
📹 Video: [Platzhalter — Screencast: Derselbe Quelltext einmal korrekt und einmal mit Blockschreibweise durch alle drei Prüfwerkzeuge]
towelscript_symbols — der Nebeneingang
symbols listet alle Module, Flows und Nodes mit Zeile und Spalte. Für kleine Workflows brauchst du es nicht. Bei 40 Nodes ist es die schnellste Antwort auf „in welcher Zeile steht eigentlich der Agent, der mir gerade Ärger macht?".
Zusammengefasst
| Stufe | Prüfe | Alarmzeichen |
|---|---|---|
check | valid, stats.nodes | weniger Nodes als geschrieben |
graph | Anzahl edges | edges: [] oder zu wenige |
compile | Agent-Typ, Verschachtelung, Vollständigkeit, links | flache Optionen, fehlende Optionen, links: [] |
Alle drei zusammen kosten weniger Zeit als eine einzige fehlgeschlagene Deploy-Runde.